/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.ABMTipoMaterial;

import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.CodificacionBrisch;
import estructurassa.entidades.TipoMaterial;
import estructurassa.expertos.ExpertoABMTipoMaterial;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMTipoMaterialException;
import estructurassa.utiles.modeloTabla.ModeloTabla;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import newotcapp.modeloComboBox.ModeloComboGenerico;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author diego
 */
public class ControladorABMTipoMaterial implements Controlador {

    PantallaABMTipoMaterial pantalla;
    ExpertoABMTipoMaterial experto;
    TipoMaterial tipoSeleccionado;
    private boolean iniciado;

    public ControladorABMTipoMaterial() {
        pantalla = new PantallaABMTipoMaterial();
        experto = (ExpertoABMTipoMaterial) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_TIPO_MATERIAL);

        pantalla.getTblTiposMateriales().setModel(new ModeloTablaABMTipoMaterial());
        pantalla.getTblTiposMateriales().setAutoCreateRowSorter(true);
        pantalla.getTblTiposMateriales().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarTipo();
            }
        });
        pantalla.getTxtDescripcion().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                guardar();
            }
        });

        /**
         * ###############################################################
         * ############################################################### Barra
         * de herramientas
         * ###############################################################
         * ###############################################################
         */
        pantalla.getBtnGuardar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                guardar();
            }
        });
        pantalla.getBtnNuevo().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                limpiarCampos();
            }
        });
        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBtnBaja().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                darBaja();
            }
        });

    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        } else {
            pantalla.toFront();
            pantalla.setVisible(true);

        }
        pantalla.getCbxClasificacion().setModel(new ModeloComboGenerico(experto.buscarCategoriasBrischTipoMat()));
        ((ModeloTablaABMTipoMaterial) pantalla.getTblTiposMateriales().getModel()).setListaElementos(experto.buscarTiposMateriales());
    }

    private void guardar() {
        if (tipoSeleccionado == null) {
            tipoSeleccionado = new TipoMaterial();
        }

        tipoSeleccionado.setNombre(pantalla.getTxtNombreTipo().getText());
        tipoSeleccionado.setCodificacionBrisch((CodificacionBrisch) ((ModeloComboGenerico) pantalla.getCbxClasificacion().getModel()).getItemSeleccionado());
        tipoSeleccionado.setDescripcion(pantalla.getTxtDescripcion().getText());
        try {
            experto.guardar(tipoSeleccionado);
        } catch (ABMTipoMaterialException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Tipo de Material Guardado correctamente.", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        ((ModeloTablaABMTipoMaterial) pantalla.getTblTiposMateriales().getModel()).setListaElementos(experto.buscarTiposMateriales());

        limpiarCampos();

    }

    private void darBaja() {
        if (tipoSeleccionado == null) {
            return;
        }
        int confirmado = JOptionPane.showConfirmDialog(
                pantalla,
                "¿Desea dar baja al material: " + tipoSeleccionado.getNombre() + "?");
        if (JOptionPane.OK_OPTION == confirmado) {
            try {
                experto.darDeBaja(tipoSeleccionado);
            } catch (ABMTipoMaterialException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                return;
            } catch (ExcepcionFachada ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }
            JOptionPane.showMessageDialog(pantalla, "El Tipo seleccionado fue dado de baja correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            ((ModeloTablaABMTipoMaterial) pantalla.getTblTiposMateriales().getModel()).setListaElementos(experto.buscarTiposMateriales());
            limpiarCampos();
        }
    }

    private void seleccionarTipo() {
        int fila = pantalla.getTblTiposMateriales().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTblTiposMateriales().convertRowIndexToModel(fila);
        tipoSeleccionado = (TipoMaterial) ((ModeloTabla) pantalla.getTblTiposMateriales().getModel()).getRow(filaModelo);
        mostrarTipo(tipoSeleccionado);
    }

    private void limpiarCampos() {
        pantalla.limpiarCampos();
        pantalla.getTxtNombreTipo().requestFocus();
        tipoSeleccionado = null;
    }

    private void mostrarTipo(TipoMaterial tipo) {
        pantalla.getTxtDescripcion().setText(tipo.getDescripcion());
        pantalla.getTxtNombreTipo().setText(tipo.getNombre());
        ((ModeloComboGenerico) pantalla.getCbxClasificacion().getModel()).setItemSeleccionado(tipo.getCodificacionBrisch());
    }

    private void salir() {
        FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.ABM_MATERIAL).iniciar();
        pantalla.setVisible(false);
    }
}
